package com.qf.day04.arr;

import java.util.Arrays;

public class ArrUtils {

    /**
     * 选择排序
     * @param arr
     */
    public static void selectionSort(int[] arr){

        for (int i = 0; i < arr.length-1; i++) {
            // 没轮操作，把最小的元素找出来，交换到i位置
            // 假设最小的元素的下标为 i
            int minIndex = i;
            for (int j = i; j <arr.length ; j++) {
                if (arr[j]<arr[minIndex]){
                    // 如果j位置的元素比假定的最小下标的值还小
                    minIndex = j;
                }
            }
            // 循环完成之后，minIndex中记录的就是最小元素所在的下标
            // 交换minIndex和i
            swap(arr,minIndex,i);
        }

    }


    /**
     * 交换arr数组中下标为 index1 和 index2 的元素
     * @param arr
     * @param index1
     * @param index2
     */
    public static void swap(int[] arr,int index1,int index2){
        int tmp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tmp;
    }


    /**
     * 冒泡排序
     * @param arr
     */
    public static void bubbleSort(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            // 遍历区间 [0,length-1-i)
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j]>arr[j+1]){
                    // 交换 j 和 j+1 位置的两个元素
                    swap(arr,j,j+1);
                }
            }
        }
        
    }

    /**
     * 创建一个新数组，并且把原来数组中的元素都拷贝到新数组中
     * @param arr1     原数组
     * @param length   新数组的长度
     * @return
     */
    public static int[] copyArr(int[] arr1,int length){
        // 创建新数组
        int[] newArr = new int[length];

        // 拷贝元素
//        copyArr(arr1,0,newArr,0,arr1.length);
        System.arraycopy(arr1,0,newArr,0,arr1.length);

        return newArr;
    }



    /**
     * 拷贝数组
     * @param arr1      原数组
     * @param oldstart  原数组的起始位置
     * @param arr2      新数组
     * @param newstart  新数组的起始位置
     * @param length    拷贝的长度
     */
    public static void copyArr(int[] arr1,int oldstart,int[] arr2,int newstart,int length){
        for (int i = oldstart; i < oldstart+length; i++) {
            arr2[newstart++]=arr1[i];
        }
    }


    /**
     * 拷贝数组的方法，把原数组中的内容拷贝到新数组中
     * arr2的长度大于等于arr1
     * @param arr1 原数组
     * @param arr2 新数组
     */
    public static void copyArr(int[] arr1,int[] arr2){

        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }

    }


    /**
     * 返回 字符串在数组中的下标
     * @param arr
     * @param target
     * @return
     */
    public static int indexStringArr(String[] arr,String target){

        for (int i = 0; i < arr.length; i++) {
            if (target.equals(arr[i])){
                return i;
            }
        }
        // 没有找到 返回-1即可
        return -1;
    }


    /**
     * 检查 某个数是否在int数组中
     * @param arr     数组
     * @param target  目标数
     * @return
     */
    public static int indexArr(int[] arr,int target){

        for (int i = 0; i < arr.length; i++) {
            if (arr[i]==target){
                return i;
            }
        }
        // 没有找到 返回-1即可
        return -1;
    }


    /**
     * 求数组中的元素的平均值
     * @param arr
     * @return
     */
    public static double avgArr(int[] arr){
        double sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum / arr.length;
    }


    /**
     * 返回数组中的最小元素
     * @param arr
     * @return
     */
    public static int minArr(int[] arr){
        int min = arr[0];
        // arr.fori 快捷键
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]<min){
                min = arr[i];
            }
        }

        return min;
    }



    /**
     * 返回int数组的最大值
     * @param arr
     * @return
     */
    public static int maxArr(int[] arr){

        int max = arr[0];
        // arr.fori 快捷键
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]>max){
                max = arr[i];
            }
        }

        return max;
    }

    /**
     * 打印String类型的数组
     * @param arr
     */
    public static void printStringArr(String[] arr){
        System.out.print("[ ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println("]");
    }

    /**
     * 打印int数组的内容
     * @param arr
     */
    public static void printIntArr(int[] arr){
        // 遍历arr数组，并且打印输出数组中的所有元素
        System.out.print("[ ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println("]");

    }

}
